package com.cyru.statemachine.core;

/**
 * description: 触发器
 *
 * @author zhangxuchuan
 * date 2022/5/1
 */
public interface Trigger<S, E, C> {

    /**
     * 事件
     */
    void setEvent(E event);

    E getEvent();

    /**
     * 条件
     */
    void setCondition(Condition<C> condition);

    Condition<C> getCondition();

    /**
     * 动作
     */
    void setAction(Action<S, E, C> action);

    Action<S, E, C> getAction();

    /**
     * 校验
     */
    boolean check(C context);

    /**
     * 执行
     * @param source  源状态
     * @param target  目标状态
     * @param event   事件
     * @param context 上下文
     */
    void execute(S source, S target, E event, C context);


}
